package work.xiaohong.common.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import work.xiaohong.common.eneity.Result;
import work.xiaohong.common.constant.StatusCode;

import java.util.HashMap;
import java.util.Map;

/**
 * @author xiaohong
 * @version 1.0
 * @date 2021/9/25 0025 11:00
 * @description 全局捕获异常类
 * 注意：@ControllerAdvice注解，全局捕获异常类，只要作用在@RequestMapping上，所有的异常都会被捕获。
 */
@Slf4j
@ControllerAdvice
public class BaseExceptionHandler {

    /**
     * 数据校验异常处理
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result handleValidException(MethodArgumentNotValidException e){
        log.error("数据校验出现问题{}，错误类型{}",e.getMessage(),e.getClass());
        BindingResult bindingResult = e.getBindingResult();
        Map map = new HashMap<String,String>();
        // 遍历获取校验错误
        bindingResult.getFieldErrors().forEach((item) -> {
            // 获取错误信息
            String error = item.getDefaultMessage();
            //获取错误字段
            String field = item.getField();
            map.put(field,error);
        });

        return new Result(true, StatusCode.PARAMETERERROR,"请求参数错误",map);
    }

    // 全局异常拦截（拦截项目中的所有异常）
//    @ExceptionHandler
//    public Result handlerException(Exception e) {
//        // 打印堆栈，以供调试
//        System.out.println("全局异常---------------");
//        e.printStackTrace();
//
//        // 不同异常返回不同状态码
//        if (e instanceof NotLoginException) {	// 如果是未登录异常
//            NotLoginException ee = (NotLoginException) e;
//            return new Result(false, StatusCode.ERROR,ee.getMessage());
//        } else if(e instanceof NotSafeException) {		// 二级认证失败异常
//            NotSafeException ee = (NotSafeException) e;
//            return new Result(false, StatusCode.ERROR,ee.getMessage());
//        } else if(e instanceof NotRoleException) {		// 如果是角色异常
//            NotRoleException ee = (NotRoleException) e;
//            return new Result(false, StatusCode.ERROR,"无此角色：" + ee.getRole());
//        } else if(e instanceof NotPermissionException) {	// 如果是权限异常
//            NotPermissionException ee = (NotPermissionException) e;
//            return new Result(false, StatusCode.ERROR,"无此权限：" + ee.getCode());
//        } else if(e instanceof DisableLoginException) {	// 如果是被封禁异常
//            DisableLoginException ee = (DisableLoginException) e;
//            return new Result(false, StatusCode.ERROR,"账号被封禁：" + ee.getDisableTime() + "秒后解封");
//        } else {	// 普通异常, 输出：500 + 异常信息
//            return new Result(false, StatusCode.ERROR,"出现异常：" + e.getMessage());
//        }
//
//    }

    /***
     * 其他异常处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result error(Exception e) {
        e.printStackTrace();
        return new Result(false,StatusCode.ERROR,"服务器内部异常");
    }
}